package org.lanqiao.tjut.service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.lanqiao.tjut.db.DBDriverFactory;
import org.lanqiao.tjut.entity.Dice;
import org.lanqiao.tjut.entity.Game;
import org.lanqiao.tjut.entity.GameScore;
import org.lanqiao.tjut.entity.Player;

public class GameService {

	/**
	 * 加载游戏信息
	 */
	@Deprecated
	public void iniGameInfo() {

		System.out.println("游戏数据准备加载完成...");
		// 向游戏表中插入游戏初始化信息
		String strSQL = "INSERT INTO TBGAME(GAMENAME,GAMERULE) VALUES(?,?);";
		// 插入数据
		DBDriverFactory.getDBDriverInstance().batch(strSQL, new Object[][] { { "掷骰子游戏", 0 }, { "掷骰子游戏", 1 } });
		System.out.println("游戏数据加载完成...");
	}

	/**
	 * 初始化游戏信息，并选择游戏
	 * 
	 * @param lstGames
	 *            游戏信息列表
	 * @return 所选择玩的游戏序对象
	 */
	public Game initGame(List<Game> lstGames) {
		// 查询可以玩的游戏列表
		String strSql = "SELECT * FROM TBGAME";
		lstGames = DBDriverFactory.getDBDriverInstance().query(strSql, new BeanListHandler<Game>(Game.class));
		System.out.println("当前游戏厅可以玩的游戏有：");
		for (int i = 0; i < lstGames.size(); i++) {
			Game game = lstGames.get(i);
			System.out.println(
					"\t [" + i + "] -- " + game.getGamename() + "----" + (game.getGamerule() == 0 ? "赌大" : "赌小"));
		}
		int gameNum = 0;
		do {
			System.out.println("选择该游戏前的编号，进行该游戏：");
			Scanner sc = new Scanner(System.in);
			gameNum = sc.nextInt();

		} while (gameNum >= lstGames.size());

		return lstGames.get(gameNum);
	}

	/**
	 * 初始化玩家队列
	 * 
	 * @param lstPlayers
	 *            本局游戏玩家队列
	 */
	public void initTeam(List lstPlayers) {
		// 注册新用户信息，并进行组建队伍
		System.out.println("开始组建游戏队伍，请录入玩家信息：");

		while (true) {
			System.out.println("请输入玩家ID:");
			Scanner sc = new Scanner(System.in);
			String strPlayerCode = sc.next();
			// 检验该玩家是否已经进行注册
			boolean isExists = isPlayerExisted(strPlayerCode);
			if (isExists) {
				// 存在
				// 从数据获取玩家信息
				List lst0 = getPlayerInfoByCode(strPlayerCode);
				// 保存成功
				// 将玩家信息存入玩家队列
				lstPlayers.add(lst0.get(0));
			} else {
				// 不存在进行注册
				System.out.println("该玩家还没有登记信息，请录入该玩家的信息：");
				System.out.println("录入姓名：");
				String strPlayerName = sc.next();
				System.out.println("录入性别：");
				String strPlayerSex = sc.next();
				String strSql = "INSERT INTO TBPLAYER(PLAYERCODE,PLAYERNAME,PLAYERSEX) VALUES(?,?,?)";
				// 信息保存
				int i = DBDriverFactory.getDBDriverInstance().update(strSql,
						new Object[] { strPlayerCode, strPlayerName, strPlayerSex });
				if (i > 0) {
					// 从数据获取玩家信息
					List lst0 = getPlayerInfoByCode(strPlayerCode);
					// 保存成功
					// 将玩家信息存入玩家队列
					lstPlayers.add(lst0.get(0));
				} else {
					// 保存失败
					System.out.println("玩家信息保存失败");
				}
			}

			// 是否退出

			System.out.println("是否继续加入游戏玩家：【'-1'停止组队】");
			String strInput = sc.next();
			if (strInput.equals("-1")) {
				// 退出
				break;
			}
		}
	}

	/**
	 * 玩游戏
	 * 
	 * @param lstPlayers
	 *            游戏玩家集合
	 * @param game
	 *            游戏对象
	 */
	public void playGame(List<Player> lstPlayers, Game game) {
		// 创建一个色子对象
		Dice dice = new Dice();

		// 生成本局游戏参与玩家的游戏成绩队列
		List<GameScore> lstGS = new ArrayList<GameScore>();
		// 每个游戏玩家掷骰子
		for (int i = 0; i < lstPlayers.size(); i++) {
			Player player = lstPlayers.get(i);
			GameScore gameScore = new GameScore();
			// 设置各个属性
			// 玩家id
			gameScore.setPlayerid(player.getPlayerid());
			// 游戏id
			gameScore.setGameid(game.getGameid());
			// 玩家所掷的色子点数
			gameScore.setGscore(dice.roll(3));

			// 将成绩对象加入 lstGS list
			lstGS.add(gameScore);
		}

		// 根据玩家所掷的点数进行判定
		Collections.sort(lstGS);
		// 输出 游戏结果信息
		System.out.println("本局游戏的结果：");
		// 根据赌大还是赌小取得本局游戏的最值
		int maxScore = 0;
		if (game.getGamerule() == 0) {
			// 赌大
			maxScore = lstGS.get(0).getGscore();
		} else {
			// 赌小
			maxScore = lstGS.get(lstGS.size() - 1).getGscore();
		}
		// 批处理参数集合
		Object[][] params = new Object[lstPlayers.size()][];

		// 循环成绩表，判定每个人的本局的输赢
		// 同时构建 批处理参数集合
		for (int i = 0; i < lstGS.size(); i++) {
			GameScore gScore = lstGS.get(i);
			gScore.setGameresult(maxScore == gScore.getGscore() ? "赢" : "输");
			System.out.println("玩家：" + gScore.getPlayerid() + "---点数：" + gScore.getGscore() + "---结果："
					+ gScore.getGameresult() + "家");

			// 同时构建 批处理参数集合
			// params[i] = new Object[] { gScore.getGscore(),
			// gScore.getPlayerid(), gScore.getGameid(),
			// gScore.getGameresult() };
			String strSql = "INSERT INTO TBGAMESCORE(GSCORE,PLAYERID,GAMEID,GAMERESULT) VALUES(?,?,?,?)";
			DBDriverFactory.getDBDriverInstance().update(strSql, new Object[] { gScore.getGscore(),
					gScore.getPlayerid(), gScore.getGameid(), gScore.getGameresult() });
		}

		// String strSql = "INSERT INTO
		// TBGAMESCORE(GSCORE,PLAYERID,GAMEID,GAMERESULT) VALUES(?,?,?,?)";
		// DBDriverFactory.getDBDriverInstance().batch(strSql, params);

		System.out.println("本局游戏结束。。。");
	}

	/**
	 * 查询该玩家编号存在
	 * 
	 * @param strPlayerCode
	 *            玩家编号
	 * @return 查询结果集
	 */
	private List getPlayerInfoByCode(String strPlayerCode) {
		// 查询语句
		String strSql = "SELECT * FROM TBPLAYER WHERE PLAYERCODE = ?";
		// 查询结果
		List<Player> lst = DBDriverFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<Player>(Player.class), new Object[] { strPlayerCode });

		return lst;
	}

	/**
	 * 查询该玩家编号存在
	 * 
	 * @param strPlayerCode
	 *            玩家编号
	 * @return 查询结果：true - 存在；false - 不存在
	 */
	private boolean isPlayerExisted(String strPlayerCode) {
		// 查询语句
		String strSql = "SELECT * FROM TBPLAYER WHERE PLAYERCODE = ?";
		// 查询结果
		List<Player> lst = DBDriverFactory.getDBDriverInstance().query(strSql,
				new BeanListHandler<Player>(Player.class), new Object[] { strPlayerCode });

		return lst != null && lst.size() > 0 ? true : false;
	}
}
